<!doctype html>
<html lang="en-us">
<head>

    <meta charset="utf-8">
    <meta name="generator" content="Hugo 0.59.1" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>SpringCloud微服务 | 林贤钦</title>
    <meta property="og:title" content="SpringCloud微服务 - 林贤钦">
    <meta property="og:type" content="article">
        
    <meta property="article:published_time" content="2020-04-16T13:27:00&#43;08:00">
        
        
    <meta property="article:modified_time" content="2020-04-16T13:27:00&#43;08:00">
        
    <meta name="Keywords" content="java,博客,项目管理,软件架构,公众号,小程序">
    <meta name="description" content="SpringCloud微服务">
        
    <meta name="author" content="林贤钦">
    <meta property="og:url" content="http://linxianqin.gitee.io/post/SpringCloud%E5%BE%AE%E6%9C%8D%E5%8A%A1/">
    <link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon">

    <link rel="stylesheet" href="/css/normalize.css">
    
        <link rel="stylesheet" href="/css/prism.css">
    
    <link rel="stylesheet" href="/css/style.css">
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

    


    
    
</head>

<body>
<header id="header" class="clearfix">
	<div class="container">
        <div class="col-group">
            <div class="site-name ">
                
                    <a id="logo" href="http://linxianqin.gitee.io">
                        林贤钦
                    </a>
                
                <p class="description">专注于Java、微信小程序、移动互联网、项目管理、软件架构</p>
            </div>
            <div>
                <nav id="nav-menu" class="clearfix">
                    <a class="current" href="http://linxianqin.gitee.io">首页</a>
                    
                    <a  href="http://linxianqin.gitee.io/archives/" title="归档">归档</a>
                    
                    <a  href="http://linxianqin.gitee.io/about/" title="关于">关于</a>
                    
                </nav>
            </div>
        </div>
    </div>
</header>


<div id="body">
        
        
    <div class="container">
        <div class="col-group">

            <div class="col-8" id="main">
                <div class="res-cons">
                    <article class="post">
                        <header>
                            <h1 class="post-title">SpringCloud微服务</h1>
                        </header>
                        <date class="post-meta meta-date">
                            2020年4月16日
                        </date>
                        
                        <div class="post-meta">
                            <span>|</span>
                            
                                <span class="meta-category"><a href="http://linxianqin.gitee.io/categories/springCloud">springCloud</a></span>
                            
                        </div>
                        
                        
                        <div class="post-meta">
                            <span id="busuanzi_container_page_pv">|<span id="busuanzi_value_page_pv"></span><span> 阅读</span></span>
                        </div>
                        
                        
                        <div class="post-content">
							<nav id="TableOfContents">
<ul>
<li><a href="#springcloud">SpringCloud</a>
<ul>
<li><a href="#一-什么是微服务">一、什么是微服务</a>
<ul>
<li><a href="#1-微服务的由来">1、微服务的由来</a></li>
<li><a href="#2-为什么需要微服务">2、为什么需要微服务</a></li>
<li><a href="#3-微服务与单体架构区别">3、微服务与单体架构区别</a></li>
<li><a href="#4-微服务本质">4、微服务本质</a></li>
<li><a href="#5-什么样的项目适合微服务">5、什么样的项目适合微服务</a></li>
</ul></li>
<li><a href="#二-什么是spring-cloud">二、什么是Spring Cloud</a>
<ul>
<li><a href="#1-spring-cloud和spring-boot是什么关系">1、Spring Cloud和Spring Boot是什么关系</a></li>
<li><a href="#2-spring-cloud相关基础服务组件">2、Spring Cloud相关基础服务组件</a>
<ul>
<li><a href="#2-1-1-服务注册与发现-负责服务的注册与发现-很好将各服务连接起来"><strong>2.1.1</strong> <strong>服务注册与发现</strong>(负责服务的注册与发现，很好将各服务连接起来)</a></li>
<li><a href="#2-1-2-负载均衡"><strong>2.1.2</strong> <strong>负载均衡</strong></a></li>
<li><a href="#2-1-3-熔断-负责监控服务之间的调用情况-连续多次失败进行熔断保护"><strong>2.1.3</strong> <strong>熔断</strong>(负责监控服务之间的调用情况，连续多次失败进行熔断保护。)</a></li>
<li><a href="#2-1-4-链路追踪-可以将所有的请求数据记录下来-方便我们进行后续分析"><strong>2.1.4</strong> <strong>链路追踪</strong>(可以将所有的请求数据记录下来，方便我们进行后续分析)</a></li>
<li><a href="#2-1-5-api网关-负责转发所有对外的请求和服务">2.1.5 API网关(负责转发所有对外的请求和服务)</a></li>
</ul></li>
<li><a href="#3-springcloud的体系结构">3、SpringCloud的体系结构</a></li>
<li><a href="#4-spring-cloud的版本">4、Spring Cloud的版本</a>
<ul>
<li><a href="#小版本">小版本</a></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
</nav>
                            

<h1 id="springcloud">SpringCloud</h1>

<h2 id="一-什么是微服务">一、什么是微服务</h2>

<h3 id="1-微服务的由来">1、微服务的由来</h3>

<p>微服务最早由Martin Fowler与James Lewis于2014年共同提出，微服务架构风格是一种使用一套小服务来开发单个应用的方式途径，每个服务运行在自己的进程中，并使用轻量级机制通信，通常是HTTP API，这些服务基于业务能力构建，并能够通过自动化部署机制来独立部署，这些服务使用不同的编程语言实现，以及不同数据存储技术，并保持最低限度的集中式管理。</p>

<h3 id="2-为什么需要微服务">2、为什么需要微服务</h3>

<p>在传统的IT行业软件大多都是各种独立系统的堆砌，这些系统的问题总结来说就是扩展性差，可靠性不高，维护成本高。到后面引入了SOA服务化，但是，由于 SOA 早期均使用了总线模式，这种总线模式是与某种技术栈强绑定的，比如：J2EE。这导致很多企业的遗留系统很难对接，切换时间太长，成本太高，新系统稳定性的收敛也需要一些时间。</p>

<h3 id="3-微服务与单体架构区别">3、微服务与单体架构区别</h3>

<p>（1）单体架构所有的模块全都耦合在一块，代码量大，维护困难。</p>

<p>​     微服务每个模块就相当于一个单独的项目，代码量明显减少，遇到问题也相对来说比较好解决。</p>

<p>（2）单体架构所有的模块都共用一个数据库，存储方式比较单一。</p>

<p>​     微服务每个模块都可以使用不同的存储方式（比如有的用redis，有的用mysql等），数据库也是单个模块对应自己的数据库。</p>

<p>（3）单体架构所有的模块开发所使用的技术一样。</p>

<p>​     微服务每个模块都可以使用不同的开发技术，开发模式更灵活。</p>

<h3 id="4-微服务本质">4、微服务本质</h3>

<p>（1）微服务，关键其实不仅仅是微服务本身，而是系统要提供一套基础的架构，这种架构使得微服务可以独立的部署、运行、升级，不仅如此，这个系统架构还让微服务与微服务之间在结构上“松耦合”，而在功能上则表现为一个统一的整体。这种所谓的“统一的整体”表现出来的是统一风格的界面，统一的权限管理，统一的安全策略，统一的上线过程，统一的日志和审计方法，统一的调度方式，统一的访问入口等等。
（2）微服务的目的是有效的拆分应用，实现敏捷开发和部署 。
（3）微服务提倡的理念团队间应该是 inter-operate, not integrate 。inter-operate是定义好系统的边界和接口，在一个团队内全栈，让团队自治，原因就是因为如果团队按照这样的方式组建，将沟通的成本维持在系统内部，每个子系统就会更加内聚，彼此的依赖耦合能变弱，跨系统的沟通成本也就能降低。</p>

<h3 id="5-什么样的项目适合微服务">5、什么样的项目适合微服务</h3>

<p>微服务可以按照业务功能本身的独立性来划分，如果系统提供的业务是非常底层的，如：操作系统内核、存储系统、网络系统、数据库系统等等，这类系统都偏底层，功能和功能之间有着紧密的配合关系，如果强制拆分为较小的服务单元，会让集成工作量急剧上升，并且这种人为的切割无法带来业务上的真正的隔离，所以无法做到独立部署和运行，也就不适合做成微服务了。</p>

<p>6、微服务开发框架</p>

<p>目前微服务的开发框架，最常用的有以下四个：</p>

<p>Spring Cloud：<a href="http://projects.spring.io/spring-cloud（现在非常流行的微服务架构）">http://projects.spring.io/spring-cloud（现在非常流行的微服务架构）</a></p>

<p>Dubbo：<a href="http://dubbo.io">http://dubbo.io</a></p>

<p>Dropwizard：<a href="http://www.dropwizard.io">http://www.dropwizard.io</a> （关注单个微服务的开发）</p>

<p>Consul、etcd&amp;etc.（微服务的模块）</p>

<h2 id="二-什么是spring-cloud">二、什么是Spring Cloud</h2>

<p>Spring Cloud是一系列框架的集合。它利用Spring Boot的开发便利性简化了分布式系统基础设施的开发，如服务发现、服务注册、配置中心、消息总线、负载均衡、 熔断器、数据监控等，都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子，它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来，通过SpringBoot风格进行再封装屏蔽掉了复杂的配置和实现原理，最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包</p>

<h3 id="1-spring-cloud和spring-boot是什么关系">1、Spring Cloud和Spring Boot是什么关系</h3>

<p>Spring Boot 是 Spring 的一套快速配置脚手架，可以基于Spring Boot 快速开发单个微服务，Spring Cloud是一个基于Spring Boot实现的开发工具；Spring Boot专注于快速、方便集成的单个微服务个体，Spring Cloud关注全局的服务治理框架； Spring Boot使用了默认大于配置的理念，很多集成方案已经帮你选择好了，能不配置就不配置，Spring Cloud很大的一部分是基于Spring Boot来实现，必须基于Spring Boot开发。可以单独使用Spring Boot开发项目，但是Spring Cloud离不开 Spring Boot。</p>

<h3 id="2-spring-cloud相关基础服务组件">2、Spring Cloud相关基础服务组件</h3>

<hr />

<p><strong>Spring Cloud Netflflix组件</strong></p>

<table>
<thead>
<tr>
<th align="center">组件名称</th>
<th align="center"><strong>作用</strong></th>
</tr>
</thead>

<tbody>
<tr>
<td align="center">Eureka</td>
<td align="center">服务注册中心</td>
</tr>

<tr>
<td align="center">Ribbon</td>
<td align="center">客户端负载均衡</td>
</tr>

<tr>
<td align="center">Feign</td>
<td align="center">声明式服务调用</td>
</tr>

<tr>
<td align="center">Hystrix</td>
<td align="center">客户端容错保护</td>
</tr>

<tr>
<td align="center">Zuul</td>
<td align="center">API服务网关</td>
</tr>
</tbody>
</table>

<hr />

<p><strong>Spring Cloud Alibaba 组件</strong></p>

<table>
<thead>
<tr>
<th align="center"><strong>组件名称</strong></th>
<th align="center"><strong>作用</strong></th>
</tr>
</thead>

<tbody>
<tr>
<td align="center">Nacos</td>
<td align="center">服务注册中心</td>
</tr>

<tr>
<td align="center">Sentinel</td>
<td align="center">客户端容错保护</td>
</tr>
</tbody>
</table>

<hr />

<p><strong>Spring Cloud原生及其他组件</strong></p>

<table>
<thead>
<tr>
<th align="center"><strong>组件名称</strong></th>
<th align="center"><strong>作用</strong></th>
</tr>
</thead>

<tbody>
<tr>
<td align="center">Consul</td>
<td align="center">服务注册中心</td>
</tr>

<tr>
<td align="center">Confifig</td>
<td align="center">分布式配置中心</td>
</tr>

<tr>
<td align="center">Gateway</td>
<td align="center">API服务网关</td>
</tr>

<tr>
<td align="center">Sleuth/Zipkin</td>
<td align="center">分布式链路追踪</td>
</tr>
</tbody>
</table>

<hr />

<table>
<thead>
<tr>
<th align="center"><strong>作用</strong></th>
<th><strong>组件名称</strong></th>
</tr>
</thead>

<tbody>
<tr>
<td align="center">服务发现</td>
<td>Netflix Eureka 、Nacos、Consul</td>
</tr>

<tr>
<td align="center">服务调用</td>
<td>Netflix Feign</td>
</tr>

<tr>
<td align="center">熔断器</td>
<td>Netflix Hystrix、Sentinel</td>
</tr>

<tr>
<td align="center">服务网关</td>
<td>Spring Cloud GateWay、zuul</td>
</tr>

<tr>
<td align="center">分布式配置</td>
<td>Spring Cloud Config  、Nacos</td>
</tr>

<tr>
<td align="center">消息总线</td>
<td>Spring Cloud Bus、Nacos、</td>
</tr>

<tr>
<td align="center">负载均衡</td>
<td>Ribbon</td>
</tr>

<tr>
<td align="center">分布式链路追踪</td>
<td>Sleuth、Zipkin</td>
</tr>
</tbody>
</table>

<hr />

<p>现在Eureka的性能出现了瓶颈，或者说开发Eureka的这个公司没有继续开发这个了，对比而下Nacos是现在做的比较好的，Nacos 是阿里巴巴推出来的一个新开源项目，是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。在另一篇我会详细讲Nacos</p>

<h4 id="2-1-1-服务注册与发现-负责服务的注册与发现-很好将各服务连接起来"><strong>2.1.1</strong> <strong>服务注册与发现</strong>(负责服务的注册与发现，很好将各服务连接起来)</h4>

<p><strong>服务注册</strong>：服务实例将自身服务信息注册到注册中心。这部分服务信息包括服务所在主机IP和提供服务</p>

<p>的Port，以及暴露服务自身状态以及访问协议等信息。</p>

<p><strong>服务发现</strong>：服务实例请求注册中心获取所依赖服务信息。服务实例通过注册中心，获取到注册到其中的</p>

<p>服务实例的信息，通过这些信息去请求它们提供的服务。</p>

<h4 id="2-1-2-负载均衡"><strong>2.1.2</strong> <strong>负载均衡</strong></h4>

<p>负载均衡是高可用网络基础架构的关键组件，通常用于将工作负载分布到多个服务器来提高网站、应</p>

<p>用、数据库或其他服务的性能和可靠性。</p>

<h4 id="2-1-3-熔断-负责监控服务之间的调用情况-连续多次失败进行熔断保护"><strong>2.1.3</strong> <strong>熔断</strong>(负责监控服务之间的调用情况，连续多次失败进行熔断保护。)</h4>

<p><strong>熔断</strong>这一概念来源于电子工程中的断路器（Circuit Breaker）。在互联网系统中，当下游服务因访问压</p>

<p>力过大而响应变慢或失败，上游服务为了保护系统整体的可用性，可以暂时切断对下游服务的调用。这</p>

<p>种牺牲局部，保全整体的措施就叫做熔断。</p>

<h4 id="2-1-4-链路追踪-可以将所有的请求数据记录下来-方便我们进行后续分析"><strong>2.1.4</strong> <strong>链路追踪</strong>(可以将所有的请求数据记录下来，方便我们进行后续分析)</h4>

<p>随着微服务架构的流行，服务按照不同的维度进行拆分，一次请求往往需要涉及到多个服务。互联网应</p>

<p>用构建在不同的软件模块集上，这些软件模块，有可能是由不同的团队开发、可能使用不同的编程语言</p>

<p>来实现、有可能布在了几千台服务器，横跨多个不同的数据中心。因此，就需要对一次请求涉及的多个</p>

<p>服务链路进行日志记录，性能监控即<strong>链路追踪</strong></p>

<h4 id="2-1-5-api网关-负责转发所有对外的请求和服务">2.1.5 API网关(负责转发所有对外的请求和服务)</h4>

<p>随着微服务的不断增多，不同的微服务一般会有不同的网络地址，而外部客户端可能需要调用多个服务</p>

<p>的接口才能完成一个业务需求，如果让客户端直接与各个微服务通信可能出现：</p>

<p>客户端需要调用不同的url地址，增加难度</p>

<p>再一定的场景下，存在跨域请求的问题</p>

<p>每个微服务都需要进行单独的身份认证</p>

<p>针对这些问题，API网关顺势而生。</p>

<p><strong>API</strong><strong>网关</strong>直面意思是将所有API调用统一接入到API网关层，由网关层统一接入和输出。一个网关的基本</p>

<p>功能有：统一接入、安全防护、协议适配、流量管控、长短链接支持、容错能力。有了网关之后，各个</p>

<p>API服务提供团队可以专注于自己的的业务逻辑处理，而API网关更专注于安全、流量、路由等问题。</p>

<h3 id="3-springcloud的体系结构">3、SpringCloud的体系结构</h3>

<p><img src="https://linxianqin.oss-cn-shenzhen.aliyuncs.com/hugo/java/springcloud/SpringCloud%E7%9A%84%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84.jpg" alt="SpringCloud的体系结构" /></p>

<h3 id="4-spring-cloud的版本">4、Spring Cloud的版本</h3>

<p>Spring Cloud并没有熟悉的数字版本号，而是对应一个开发代号。</p>

<table>
<thead>
<tr>
<th>Cloud代号</th>
<th align="left">Boot版本(train)</th>
<th>Boot版本(tested)</th>
<th>lifecycle</th>
</tr>
</thead>

<tbody>
<tr>
<td>Angle</td>
<td align="left">1.2.x</td>
<td>incompatible with 1.3</td>
<td>EOL in July 2017</td>
</tr>

<tr>
<td>Brixton</td>
<td align="left">1.3.x</td>
<td>1.4.x</td>
<td>2017-07卒</td>
</tr>

<tr>
<td>Camden</td>
<td align="left">1.4.x</td>
<td>1.5.x</td>
<td>-</td>
</tr>

<tr>
<td>Dalston</td>
<td align="left">1.5.x</td>
<td>not expected 2.x</td>
<td>-</td>
</tr>

<tr>
<td>Edgware</td>
<td align="left">1.5.x</td>
<td>not expected 2.x</td>
<td>-</td>
</tr>

<tr>
<td>Finchley</td>
<td align="left">2.0.x</td>
<td>not expected 1.5.x</td>
<td>-</td>
</tr>

<tr>
<td>Greenwich</td>
<td align="left"><strong>2.1.x</strong></td>
<td></td>
<td></td>
</tr>

<tr>
<td>Hoxton</td>
<td align="left">2.2.x</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>

<p>开发代号看似没有什么规律，但实际上首字母是有顺序的，比如：Dalston版本，我们可以简称 D 版本，对应的 Edgware 版本我们可以简称 E 版本.</p>

<h4 id="小版本">小版本</h4>

<p>Spring Cloud 小版本分为:</p>

<p>SNAPSHOT： 快照版本，随时可能修改</p>

<p>M： MileStone，M1表示第1个里程碑版本，一般同时标注PRE，表示预览版版。</p>

<p>SR： Service Release，SR1表示第1个正式版本，一般同时标注GA：(GenerallyAvailable),表示稳定版本。</p>

                        </div>
						 
                        
<div class="post-archive">
    <ul class="post-copyright">
        <li><strong>原文作者：</strong><a rel="author" href="http://linxianqin.gitee.io">林贤钦</a></li>
        <li style="word-break:break-all"><strong>原文链接：</strong><a href="http://linxianqin.gitee.io/post/SpringCloud%E5%BE%AE%E6%9C%8D%E5%8A%A1/">http://linxianqin.gitee.io/post/SpringCloud%E5%BE%AE%E6%9C%8D%E5%8A%A1/</a></li>
        <li><strong>版权声明：</strong>本作品采用<a rel="license" href="https://linxianqin.gitee.io">知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议</a>进行许可，非商业转载请注明出处（作者，原文链接），商业转载请联系作者获得授权。</li>
    </ul>
</div>
<br/>



                        

<div class="post-archive">
    <h2>See Also</h2>
    <ul class="listing">
        
        <li><a href="/post/%E9%98%BF%E9%87%8C%E4%BA%91%E8%A7%86%E9%A2%91%E7%82%B9%E6%92%AD%E6%9C%8D%E5%8A%A1/">阿里云视频点播服务前后端实现</a></li>
        
        <li><a href="/post/%E9%98%9F%E5%88%97/">队列</a></li>
        
        <li><a href="/post/%E7%A8%80%E7%96%8F%E6%95%B0%E7%BB%84/">稀疏数组</a></li>
        
        <li><a href="/post/%E9%98%BF%E9%87%8C%E4%BA%91EasyExcel%E5%AE%9E%E7%8E%B0%E5%90%8E%E7%AB%AF%E5%AF%B9Excel%E7%9A%84%E8%AF%BB%E5%86%99%E6%93%8D%E4%BD%9C/">使用阿里云EasyExcel实现后端对Excel的读写操作</a></li>
        
        <li><a href="/post/%E9%98%BF%E9%87%8C%E4%BA%91oss%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E6%9C%8D%E5%8A%A1%E5%AE%9E%E7%8E%B0/">阿里云oss对象存储服务实现</a></li>
        
    </ul>
</div>


                        <div class="post-meta meta-tags">
                            
                            <ul class="clearfix">
                                
                                <li><a href="http://linxianqin.gitee.io/tags/springCloud">springCloud</a></li>
                                
                                <li><a href="http://linxianqin.gitee.io/tags/java">java</a></li>
                                
                            </ul>
                            
                        </div>
                    </article>
                    
    

    
    
    <div class="post bg-white">
      <script src="https://utteranc.es/client.js"
            repo= "757610938/hugo-blogs-utterances"
            issue-term="pathname"
            theme="github-light"
            crossorigin="anonymous"
            async>
      </script>
    </div>
    
                </div>
            </div>
            <div id="secondary">
    <section class="widget">
        <form id="search" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank" _lpchecked="1">
      
      <input type="text" name="q" maxlength="20" placeholder="Search">
      <input type="hidden" name="sitesearch" value="http://linxianqin.gitee.io">
      <button type="submit" class="submit icon-search"></button>
</form>
    </section>
    
    <section class="widget">
        <h3 class="widget-title">最近文章</h3>
<ul class="widget-list">
    
    <li>
        <a href="http://linxianqin.gitee.io/post/java-%E5%8F%8D%E5%B0%84/" title="Java 反射">Java 反射</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/java-%E9%93%BE%E8%A1%A8/" title="Java 链表">Java 链表</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/%E7%9F%AD%E4%BF%A1%E6%B3%A8%E5%86%8C%E5%92%8C%E5%BE%AE%E4%BF%A1%E7%99%BB%E5%BD%95%E7%9A%84%E5%AE%9E%E7%8E%B0/" title="短信注册和微信登录的实现">短信注册和微信登录的实现</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/OAuth2.0%E8%AE%A4%E8%AF%81%E6%8E%88%E6%9D%83%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95/" title="OAuth2.0认证授权单点登录">OAuth2.0认证授权单点登录</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/Nacos%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/" title="Nacos服务注册中心">Nacos服务注册中心</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/SpringCloud%E5%BE%AE%E6%9C%8D%E5%8A%A1/" title="SpringCloud微服务">SpringCloud微服务</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/%E9%98%BF%E9%87%8C%E4%BA%91%E8%A7%86%E9%A2%91%E7%82%B9%E6%92%AD%E6%9C%8D%E5%8A%A1/" title="阿里云视频点播服务前后端实现">阿里云视频点播服务前后端实现</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/%E9%98%9F%E5%88%97/" title="队列">队列</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/%E7%A8%80%E7%96%8F%E6%95%B0%E7%BB%84/" title="稀疏数组">稀疏数组</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/%E9%98%BF%E9%87%8C%E4%BA%91EasyExcel%E5%AE%9E%E7%8E%B0%E5%90%8E%E7%AB%AF%E5%AF%B9Excel%E7%9A%84%E8%AF%BB%E5%86%99%E6%93%8D%E4%BD%9C/" title="使用阿里云EasyExcel实现后端对Excel的读写操作">使用阿里云EasyExcel实现后端对Excel的读写操作</a>
    </li>
    
</ul>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">分类</h3>
<ul class="widget-list">
    
    <li><a href="http://linxianqin.gitee.io/categories/JWT/">JWT (2)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/hugo/">hugo (2)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/java/">java (18)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/java8/">java8 (1)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/springCloud/">springCloud (2)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/springSecurity/">springSecurity (4)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/vue/">vue (5)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/yml/">yml (1)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/">数据结构 (3)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/">软件测试 (1)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/%E9%98%BF%E9%87%8C%E4%BA%91/">阿里云 (4)</a></li>
    
</ul>
    </section>

    <section class="widget">
        <h3 class="widget-title">标签</h3>
<div class="tagcloud">
    
    <a href="http://linxianqin.gitee.io/tags/JWT/">JWT</a>
    
    <a href="http://linxianqin.gitee.io/tags/hugo/">hugo</a>
    
    <a href="http://linxianqin.gitee.io/tags/java/">java</a>
    
    <a href="http://linxianqin.gitee.io/tags/java8/">java8</a>
    
    <a href="http://linxianqin.gitee.io/tags/spring/">spring</a>
    
    <a href="http://linxianqin.gitee.io/tags/springBoot/">springBoot</a>
    
    <a href="http://linxianqin.gitee.io/tags/springCloud/">springCloud</a>
    
    <a href="http://linxianqin.gitee.io/tags/ssm/">ssm</a>
    
    <a href="http://linxianqin.gitee.io/tags/vue/">vue</a>
    
    <a href="http://linxianqin.gitee.io/tags/yml/">yml</a>
    
    <a href="http://linxianqin.gitee.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/">数据结构</a>
    
    <a href="http://linxianqin.gitee.io/tags/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/">软件测试</a>
    
    <a href="http://linxianqin.gitee.io/tags/%E9%98%BF%E9%87%8C%E4%BA%91/">阿里云</a>
    
</div>
    </section>

    
<section class="widget">
    <h3 class="widget-title">友情链接</h3>
    <ul class="widget-list">
        
        <li>
            <a target="_blank" href="https://www.cnki.net" title="中国知网">中国知网</a>
        </li>
        
        <li>
            <a target="_blank" href="https://linxianqin.com" title="个人的另一个博客网站(国内加载慢)">个人的另一个博客网站(国内加载慢)</a>
        </li>
        
    </ul>
</section>


    <section class="widget">
        <h3 class="widget-title">其它</h3>
        <ul class="widget-list">
            <li><a href="http://linxianqin.gitee.io/index.xml">文章 RSS</a></li>
        </ul>
    </section>
</div>
        </div>
    </div>
</div>
<footer id="footer">
    <div class="container">
        &copy; 2020 <a href="http://linxianqin.gitee.io">林贤钦 By 林贤钦</a>.
        Powered by <a rel="nofollow noreferer noopener" href="https://gohugo.io" target="_blank">Hugo</a>.
        <a href="https://www.flysnow.org/" target="_blank">Theme</a> based on <a href="https://github.com/rujews/maupassant-hugo" target="_blank">maupassant</a>.
        
    </div>
</footer>


    
    <script type="text/javascript">
        
        (function () {
            $("pre code").parent().addClass("line-numbers")
        }());

        window.MathJax = {
            tex2jax: {
                inlineMath: [['$', '$']],
                processEscapes: true
                }
            };
    </script>
    <script type="text/javascript" src="/js/prism.js" async="true"></script>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML' async></script>


<a id="rocket" href="#top"></a>
<script type="text/javascript" src="/js/totop.js?v=0.0.0" async=""></script>

<script type="application/javascript">
var doNotTrack = false;
if (!doNotTrack) {
	window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
	ga('create', 'GA ID', 'auto');
	
	ga('send', 'pageview');
}
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>



    <script type="text/javascript" src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" async></script>




</body>
</html>
